package com.hspedu.reflection.question;

import com.hspedu.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion {
    public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //传统方式 new 对象->调用方法
//        Cat cat = new Cat();
//        cat.hi();

        //反射
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\re.properties"));
            String classfullpath=properties.get("classfullpath").toString();
            String methodName=properties.get("method").toString();
            System.out.println("classfullpath："+classfullpath);
            System.out.println("method："+methodName);
            System.out.println("\n");
            System.out.println("\n");
            System.out.println("\n");
            System.out.println("\n");
            //使用反射机制解决
            //加载类
           Class cls  = Class.forName(classfullpath);
           //通过 cls 得到加载类的对象实例
            Object o =cls.newInstance();
            System.out.println("o="+o.getClass());//得到运行类型
            //通过cls 的到你加载的类 com.hspedu.Cat的 methodName"hi"的方法对象
            //在反射中，可以把方法视为对象
            Method method1= cls.getMethod(methodName);
            //通过method1调用方法 即通过 方法对象实现调用方法
            System.out.println("-----------------");
            method1.invoke(o);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
